AWS CDK で Lambda 関数の再起ループ保護が設定可能になっていました

AWS CDK で Lambda 関数の再起ループ保護が設定可能になっていました

Clock Icon2024.08.20

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最新のリリースで、下記のアップデートが追加されていました。

https://github.com/aws/aws-cdk/releases/tag/v2.153.0

lambda: support Recursive Loop Protection property (572fe0a)

「Recursive Loop Protection」は再起ループ保護のことで、機能自体は昨年に実装されたものですが、このたびのアップデートにより Lambda 関数の L2 Construct でも設定が可能となりました。

https://dev.classmethod.jp/articles/detecting-and-stopping-recursive-loops-in-aws-lambda-functions/

https://docs.aws.amazon.com/lambda/latest/dg/invocation-recursion.html#invocation-recursion-supported

ちなみに既定値は 停止 なので、保護を解除する必要がなければ本設定を行う必要はありません。

試してみた

CDK モジュールのアップデート

AWS CDK モジュールを v2.153.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest

これにより Function Construct クラスで recursiveLoop プロパティが利用可能となります。

CDK で再起ループ保護を設定する

それでは CDK で再起ループ保護を設定してみます。ここではNodejsFunction Construct クラスで試してみます。このクラスも Function Construct をベースにしているので recursiveLoop プロパティが利用可能です。

RecursiveLoop.TERMINATE を設定すると再起ループ検出時の動作が「停止」となります。これは既定値となります。

lib/cdk-sample-stack.ts
import { aws_lambda_nodejs, aws_lambda, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new aws_lambda_nodejs.NodejsFunction(this, 'MyFunction', {
      runtime: aws_lambda.Runtime.NODEJS_20_X,
      recursiveLoop: aws_lambda.RecursiveLoop.TERMINATE, // 再起ループを停止
    });
  }
}

上記を CDK デプロイしてマネジメントコンソールから関数の設定を確認すると、再起ループ保護(Recursive loop detection)の設定が Terminate recursive loops、つまり「停止」となっていることが確認できました。

次に、再起ループを「許可」してみます。その場合は RecursiveLoop.ALLOW を設定します。

lib/cdk-sample-stack.ts
import { aws_lambda_nodejs, aws_lambda, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new aws_lambda_nodejs.NodejsFunction(this, 'MyFunction', {
      runtime: aws_lambda.Runtime.NODEJS_20_X,
      recursiveLoop: aws_lambda.RecursiveLoop.ALLOW, // 再起ループを許可
    });
  }
}

デプロイした上で再度設定を確認してみると、Allow recursive loops、つまり再起ループ保護が「許可」となっていることが確認できました。

おわりに

AWS CDK で Lambda 関数の再起ループ保護が設定可能になっていたので共有しました。

これにより再起ループ保護を簡単に許可できるようになりました、と言いたいところですが、Lamnda 関数の再起ループによる利用は AWS アカウントに予期しない料金が請求される可能性があるため、そもそも推奨されていません。どうしても必要な場合を除いて recursiveLoop プロパティはいじらないようにした方が賢明です。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.